package com.newlink.building.login.ui.fragments

import android.text.Editable
import android.text.TextWatcher
import android.view.View
import com.newlink.building.login.R
import com.newlink.building.login.common.Module_Login_Constant
import com.newlink.building.login.databinding.LayoutVerifyEmailBinding
import com.newlink.building.login.event.VerifyEmailEvent
import com.newlink.building.login.mvp.contract.Module_Login_InputEmailContract
import com.newlink.building.login.ui.Module_Login_ForgetPwdEmailActivityNL
import com.newlink.building.common_base.base.BaseMvpFragment
import com.newlink.building.common_base.ext.showToastImmediately
import com.newlink.building.common_base.utils.DialogUtil
import com.newlink.building.common_base.utils.RegexUtils
import com.newlink.building.login.mvp.presenter.Module_Login_InputEmailPresenter
import org.greenrobot.eventbus.EventBus
import org.jetbrains.anko.sdk27.coroutines.onClick
import org.jetbrains.anko.support.v4.toast

/**
 * @Author: admin
 * @Date: 2022/9/13
 * @Description: 输入验证邮箱页面，用于用户输入邮箱地址并获取验证码。
 * @License:  Copyright  1998 Fanvil Technology Co., Ltd. All rights reserved.
 */
class Module_Login_VerifyEmailFragment :
    BaseMvpFragment<Module_Login_InputEmailContract.View, Module_Login_InputEmailContract.Presenter>(),
    Module_Login_InputEmailContract.View {

    // 视图绑定实例
    private lateinit var binding: LayoutVerifyEmailBinding

    // 用户输入的邮箱地址
    private var enteredEmail: String? = null

    // 等待对话框
    private val loadingDialog by lazy {
        DialogUtil.getWaitDialog(requireContext())
    }

    /**
     * Companion object 用于提供Fragment实例。
     */
    companion object {
        fun getInstance(): Module_Login_VerifyEmailFragment {
            return Module_Login_VerifyEmailFragment()
        }
    }

    /**
     * 绑定布局文件并返回根视图。
     */
    override fun attachLayoutRes(): View {
        binding = LayoutVerifyEmailBinding.inflate(layoutInflater)
        return binding.root
    }

    /**
     * 懒加载方法，当前未实现具体逻辑。
     */
    override fun lazyLoad() {
        // 无需额外的数据加载
    }

    /**
     * 创建Presenter实例。
     */
    override fun createPresenter(): Module_Login_InputEmailContract.Presenter = Module_Login_InputEmailPresenter()

    /**
     * 初始化视图组件和设置监听器。
     */
    override fun initView(view: View) {
        setupEmailInputListener()
        setupClickListeners()
    }

    /**
     * 设置邮箱输入框的文本变化监听器，以控制“获取验证码”按钮的可用状态。
     */
    private fun setupEmailInputListener() {
        binding.resetAccountEt.setBackgroundResource(R.drawable.et_underline_selector) // 设置背景资源
        binding.resetAccountEt.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
            override fun afterTextChanged(s: Editable?) {
                // 当文本不为空时，启用“获取验证码”按钮
                binding.btnGetVerifyCode.isEnabled = !s.isNullOrBlank()
            }
        })
    }

    /**
     * 设置所有可点击视图的监听器。
     */
    private fun setupClickListeners() {
        // 点击“短信找回”文本跳转到手机验证页面
        binding.tvSmsFind.setOnClickListener {
            (activity as? Module_Login_ForgetPwdEmailActivityNL)?.showFragment(
                Module_Login_Constant.Type.RESET_VERIFY_MOBILE,
                ""
            )
        }

        // 点击“获取验证码”按钮，进行邮箱验证并发送请求
        binding.btnGetVerifyCode.onClick {
            val emailContent = binding.resetAccountEt.text.toString()
            if (!validateEmailFormat(emailContent)) {
                // 如果邮箱格式不正确，显示错误提示并返回
                showToastImmediately(R.string.user_reset_email_error_format)
                return@onClick
            }

            enteredEmail = emailContent
            loadingDialog.show() // 显示加载对话框

            if (mPresenter == null) {
                // 如果Presenter为null，则只进行Toast提示（通常用于调试或Mock）
                toast("sendEmail : $enteredEmail")
            } else {
                // 调用Presenter发送邮箱验证请求
                mPresenter?.sendEmail(
                    emailContent,
                    (activity as Module_Login_ForgetPwdEmailActivityNL).mUserCategory
                )
            }
        }
    }

    /**
     * 验证邮箱格式是否正确。
     * @param email 要验证的邮箱字符串。
     * @return 如果邮箱格式正确返回true，否则返回false。
     */
    private fun validateEmailFormat(email: String): Boolean {
        // 使用两种正则表达式检查邮箱格式
        return RegexUtils.checkEmail(email) || RegexUtils.checkEmail2(email)
    }

    /**
     * 发送邮箱验证成功回调。
     * 隐藏加载对话框，并通过EventBus发送邮箱验证成功事件。
     */
    override fun sendEmailSuccess() {
        loadingDialog.dismiss()
        enteredEmail?.let {
            EventBus.getDefault().post(VerifyEmailEvent(it))
        }
    }

    /**
     * 发送邮箱验证失败回调。
     * 隐藏加载对话框。
     * @param reason 失败原因的字符串。
     */
    override fun sendEmailFailed(reason: String) {
        loadingDialog.dismiss()
    }

    /**
     * 隐藏加载状态回调（BaseMvpFragment接口方法）。
     * 确保加载对话框被隐藏。
     */
    override fun hideLoading() {
        super.hideLoading()
        loadingDialog.dismiss()
    }
}